///////////////////////////////////////////////////////////////////////////////
// File:        MessageBlock.hpp
// Author:      671643387@qq.com
// Description: 
///////////////////////////////////////////////////////////////////////////////

#if !defined(SHARED_UTIL_MESSAGEBLOCK_HPP_)
#define SHARED_UTIL_MESSAGEBLOCK_HPP_

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

#include <cassert>
#include <cstddef>
#include <cstdint>
#include <vector>
#include <memory.h>
#include <boost/shared_ptr.hpp>

///////////////////////////////////////////////////////////////////////////////
class MessageBlock
{
public:
    ///////////////////////////////////////////////////////////////////////////
    MessageBlock(const char* dat, std::size_t len)
        : rpos_(0)
        , storage_(len)
    {
        memcpy(&storage_[0], dat, len);
    }

public:
    ///////////////////////////////////////////////////////////////////////////
    std::vector<char>::size_type size(void) const
    {
        return storage_.size() - rpos_;
    }

    const char* contents(void) const
    {
        assert(rpos_ < storage_.size() && rpos_ >= 0);
        return &storage_[rpos_];
    }

    void rpos(std::size_t len)
    {
        rpos_ += len;
    }

private:
    ///////////////////////////////////////////////////////////////////////////
    std::size_t         rpos_;
    std::vector<char>   storage_;
};

typedef boost::shared_ptr<MessageBlock> MessageBlockPtr;

#endif //SHARED_UTIL_MESSAGEBLOCK_HPP_
